/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.academik.controller;

import java.io.IOException;
import java.io.Serializable;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.ServletContext;
import org.academik.model.Alumno;
import org.academik.model.Compromiso;
import org.academik.model.Detallerecibo;
import org.academik.model.DetallereciboId;
import org.academik.model.Estadoalumno;
import org.academik.model.Lugtrabajo;
import org.academik.model.Matricula;
import org.academik.model.Padre;
import org.academik.model.PadreAlumno;
import org.academik.model.Persona;
import org.academik.model.Problemasalud;
import org.academik.model.Recibo;
import org.academik.model.Recordanecdotico;
import org.academik.model.Sacalumno;
import org.academik.model.SacalumnoId;
import org.academik.model.Seccion;
import org.academik.model.Serie;
import org.academik.model.Ubicacion;
import org.academik.util.FacesUtil;
import org.academik.util.HibernateUtil;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.primefaces.event.FlowEvent;
import org.primefaces.event.SelectEvent;

/**
 *
 * @author Javier
 */
@ManagedBean(name = "inscripcionBeanOriginal")
@ViewScoped
public class InscripcionBeanOriginal extends AbstractViewScopedBean implements Serializable {

    /** Declaracion de Variables */
    private Alumno alumno;
    private Persona persona;
    private Problemasalud problemaSalud;
    private ArrayList<Ubicacion> listaUbicacion;
    private Long selectedUbicacion;
    private Long selectedDepartamento;
    private ArrayList<Problemasalud> problemasDeSalud;
    private Problemasalud selectedProblema;
    private ArrayList<Object[]> alumnos;
    private Boolean bautismo;
    private Boolean comunion;
    private Boolean confirmacion;
    private Object[] selectedAlumno;
    private boolean boEditAlumno;
    private ArrayList<SelectItem> listaUbicaciones;
    private Persona personaPadre;
    private Persona personaMadre;
    private Persona personaResponsable;
    private Padre padre;
    private Padre madre;
    private Lugtrabajo lugarTrabPadre;
    private Lugtrabajo lugarTrabMadre;
    private Lugtrabajo lugarTrabResponsable;
    private String buscarPadre;
    private String buscarMadre;
    private String buscarResponsable;
    private boolean datosIguales;
    private String direccionTemp; /* Variables para control de datos iguales entre madre y padre */

    private String telefonoTemp;
    private String quienResponsable; //Para cuando seleccione del combo al responsable saber que datos asignar
    private MatriculaBean matricula = (MatriculaBean) FacesUtil.getBean("matriculaBean");
    private Compromiso compromiso;
    private ArrayList<Compromiso> compromisos;
    private Compromiso selectedCompromiso;
    private boolean asignarRecibo; /*Si se generara automatico o manual*/

    private Recibo recibo;
    private String buscarAlumno;
    private Persona personaAlumno;
    private boolean boMostrarRecibo;
    //private ArrayList<Object[]> arregloMatriculas;
    private Recordanecdotico record;
    private Long selectedSeccion;
    private boolean boMostrarBuscaResp;
    private Object[] selectedMatricula;
    private boolean boEditarMatricula;
    private String tempString;
    private Long tempUbicacion;

    /** Creates a new instance of InscripcionBean */
    public InscripcionBeanOriginal() {
        this.nuevo();
    }

    @Override
    public void crear() {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        try {
            tx = (Transaction) session.beginTransaction();

            System.out.println("Padre: " + this.personaPadre.getVcNombres());
            System.out.println("Madre: " + this.personaMadre.getVcNombres());
            System.out.println("Padre: " + this.matricula.getArregloMatriculas().size());
            System.out.println("Padre: " + this.padre.getVcEstadoCivil());


            //Alamacena los datos de los padres
            this.personaPadre.setBoPadre(true);
            session.saveOrUpdate(this.personaPadre);
            this.lugarTrabPadre.setPersona(this.personaPadre);
            session.saveOrUpdate(this.lugarTrabPadre);
            Padre tempPadre = new Padre();
            tempPadre.setVcEstadoCivil(this.padre.getVcEstadoCivil());
            tempPadre.setPersona(this.personaPadre);
            session.saveOrUpdate(tempPadre);


            this.personaMadre.setBoPadre(true);
            session.saveOrUpdate(this.personaMadre);
            this.lugarTrabMadre.setPersona(this.personaMadre);
            session.saveOrUpdate(this.lugarTrabMadre);
            Padre tempMadre = new Padre();
            tempMadre.setVcEstadoCivil(this.padre.getVcEstadoCivil());
            tempMadre.setPersona(this.personaMadre);
            session.saveOrUpdate(tempMadre);

            //Almacena los datos del responsable
            if (this.matricula.isCargarPersona()) {
                this.matricula.getResponsable().setBoResponsable(true);
                session.update(this.matricula.getResponsable());
            } else {
                session.save(this.matricula.getResponsable());
            }
            System.out.println(this.matricula.getArregloMatriculas().size());

            Iterator iterMatricula = this.matricula.getArregloMatriculas().iterator();
            while (iterMatricula.hasNext()) {
                Object[] obj = (Object[]) iterMatricula.next();

                //Almacena los datos del recibo
                Recibo r = (Recibo) obj[3];
                boolean aRecibo = ((Boolean) obj[10]).booleanValue();
                Serie sr = (Serie) session.load(Serie.class, new Long(1));

                if (!aRecibo) {
                    sr.setNuUltimoValor(sr.getNuUltimoValor() + 1);
                    r.setNuNumRecibo(sr.getNuUltimoValor());
                }

                session.saveOrUpdate(sr);
                r.setSerie(sr);
                r.setDaFechImpresion(new Date());
                r.setVcConcepto("Matricula");



                session.saveOrUpdate(r);

                //Alamacena el detalle del recibo
                ArrayList<Object[]> listaDetalles = (ArrayList<Object[]>) obj[8];
                Iterator iterDetalle = listaDetalles.iterator();
                while (iterDetalle.hasNext()) {
                    Object[] obj_2 = (Object[]) iterDetalle.next();
                    Detallerecibo detalle = (Detallerecibo) obj_2[1];
                    Long idServicio = (Long) obj_2[2];
                    //Catalogoservicios servicio = (Catalogoservicios) session.load(Catalogoservicios.class, idServicio);
                    DetallereciboId idDetalle = new DetallereciboId();
                    idDetalle.setReciboIdRecibo(r.getIdRecibo());
                    idDetalle.setCatalogoServiciosIdCatalogoServicios(idServicio);
                    detalle.setRecibo(r);
                    detalle.setId(idDetalle);
                    session.saveOrUpdate(detalle);
                }

                //Almacena los datos de la matricula
                Matricula m = (Matricula) obj[0];
                Persona pa = (Persona) obj[1];
                Long idSeccion = (Long) obj[4];

                Alumno al = new Alumno(); //Crea un nuevo alumno si no existe
                if (pa.getIdPersona() != null) {
                    Criteria cAlumno = session.createCriteria(Alumno.class);
                    cAlumno.add(Restrictions.eq("persona", pa));
                    al = (Alumno) cAlumno.uniqueResult();
                } else {
                    al = (Alumno) obj[11];
                    System.out.println("IdUbicacion: "+(Long)(obj[12]));
                    System.out.println("PArtida Alumno: "+al.getNuPartida());
                    Ubicacion municipio = (Ubicacion) session.load(Ubicacion.class, (Long)(obj[12]));
                    al.setVcEstado("A");
                    al.setUbicacion(municipio);
                }
                session.saveOrUpdate(al);

                //Registra los sacramentos del alumno
                if (((Boolean) (obj[13])).booleanValue()) {
                    Sacalumno tempBautismo = new Sacalumno();
                    SacalumnoId idBautismo = new SacalumnoId();
                    idBautismo.setAlumnoIdAlumno(al.getIdAlumno());
                    idBautismo.setVcSacramento("Bautismo");
                    tempBautismo.setId(idBautismo);
                    session.saveOrUpdate(tempBautismo);
                }
                if (((Boolean) (obj[14])).booleanValue()) {
                    Sacalumno tempComunion = new Sacalumno();
                    SacalumnoId idComunion = new SacalumnoId();
                    idComunion.setAlumnoIdAlumno(al.getIdAlumno());
                    idComunion.setVcSacramento("Comunion");
                    tempComunion.setId(idComunion);
                    session.saveOrUpdate(tempComunion);
                }
                if (((Boolean) (obj[15])).booleanValue()) {
                    Sacalumno tempConfirmacion = new Sacalumno();
                    SacalumnoId idConfirmacion = new SacalumnoId();
                    idConfirmacion.setAlumnoIdAlumno(al.getIdAlumno());
                    idConfirmacion.setVcSacramento("Confirmacion");
                    tempConfirmacion.setId(idConfirmacion);
                    session.saveOrUpdate(tempConfirmacion);
                }

                if (pa.getIdPersona() == null) {
                    //Registro los problemas de salud del alumno
                    Iterator iterProblema = ((ArrayList<Problemasalud>) obj[16]).iterator();
                    while (iterProblema.hasNext()) {
                        Problemasalud tempProblema = (Problemasalud) iterProblema.next();
                        tempProblema.setAlumno(al);
                        session.saveOrUpdate(tempProblema);
                    }

                    //Vincula al alumno con los padres
                    PadreAlumno padreAlumno = new PadreAlumno();
                    padreAlumno.setVcParentesco("Padre");
                    padreAlumno.setPadre(tempPadre);
                    session.saveOrUpdate(padreAlumno);

                    PadreAlumno madreAlumno = new PadreAlumno();
                    madreAlumno.setVcParentesco("Madre");
                    madreAlumno.setPadre(tempMadre);
                    session.saveOrUpdate(madreAlumno);
                }

                //Registra la inscripcion en los movimientos del alumno
                Estadoalumno ea = new Estadoalumno();
                ea.setAlumno(al);
                ea.setVcFecMovimiento(new Date());
                ea.setVcRazon("Inscripción nuevo ingreso");
                ea.setVcTipMovimiento("Inscripcion"); //OJO colocar un combobox en el dialogo de matricula para elegir si es reingreso o matricula ordinaria
                session.save(ea);

                Seccion s = (Seccion) session.load(Seccion.class, idSeccion);

                m.setAlumno(al);
                m.setRecibo(r);
                m.setPersona(this.matricula.getResponsable());
                m.setSeccion(s);
                m.setDaFechMatricula(new Date());
                session.saveOrUpdate(m);

                //Almancena los datos del compromiso si extiste alguno
                ArrayList<Compromiso> listaCompromisos = (ArrayList<Compromiso>) obj[2];
                Iterator iterCompromiso = listaCompromisos.iterator();
                if (iterCompromiso.hasNext()) {
                    Recordanecdotico rd = (Recordanecdotico) obj[5];
                    rd.setMatricula(m);
                    session.saveOrUpdate(rd);
                    while (iterCompromiso.hasNext()) {
                        Compromiso cp = (Compromiso) iterCompromiso.next();
                        cp.setRecordanecdotico(rd);
                        cp.setDaFecCompromiso(new Date());
                        session.saveOrUpdate(cp);
                    }
                }
            }
            session.flush();
            session.clear();
            tx.commit();
            this.nuevo();
            try {
                ExternalContext ctx = FacesContext.getCurrentInstance().getExternalContext();
                String ctxPath = ((ServletContext) ctx.getContext()).getContextPath();
                ctx.redirect(ctxPath + "/faces/frmConsultaMatricula.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(MatriculaBean.class.getName()).log(Level.SEVERE, null, ex);
            }
            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_INFO, "Información:", "El nivel se creo satisfactoriamente"));
        } catch (HibernateException e) {
            tx.rollback();
            e.printStackTrace();
            FacesUtil.hibernateException(e);
        } finally {
            session.close();
        }
    }

    @Override
    public void eliminar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void cargarOpciones() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void cargarOpciones(int id) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void buscar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void modificar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void cargarResgistros() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void nuevo() {
        this.alumno = new Alumno();
        this.persona = new Persona();
        this.problemaSalud = new Problemasalud();
        this.listaUbicacion = new ArrayList<Ubicacion>();
        this.problemasDeSalud = new ArrayList<Problemasalud>();
        this.selectedUbicacion = null;
        this.selectedProblema = null;
        this.alumnos = new ArrayList<Object[]>();
        this.bautismo = false;
        this.comunion = false;
        this.confirmacion = false;
        this.selectedAlumno = null;
        this.boEditAlumno = false;
        this.selectedDepartamento = null;
        this.listaUbicaciones = new ArrayList<SelectItem>();

        this.personaPadre = new Persona();
        this.personaMadre = new Persona();
        this.personaResponsable = new Persona();
        this.padre = new Padre();
        this.madre = new Padre();
        this.lugarTrabPadre = new Lugtrabajo();
        this.lugarTrabMadre = new Lugtrabajo();
        this.lugarTrabResponsable = new Lugtrabajo();
        this.buscarPadre = null;
        this.buscarMadre = null;
        this.buscarResponsable = null;
        this.direccionTemp = null;
        this.telefonoTemp = null;
        this.quienResponsable = null;

        //this.matricula = new Matricula();
        this.compromiso = new Compromiso();
        this.compromisos = new ArrayList<Compromiso>();
        this.selectedCompromiso = new Compromiso();
        this.asignarRecibo = false;
        this.boMostrarRecibo = false;
        this.recibo = new Recibo();
        this.buscarAlumno = null;
        this.personaAlumno = new Persona();
        this.matricula.setArregloMatriculas(new ArrayList<Object[]>());
        this.record = new Recordanecdotico();
        this.selectedSeccion = null;
        this.boMostrarBuscaResp = false;
        this.selectedMatricula = null;
        this.boEditarMatricula = false;
        this.matricula.setBoInscripcion(true);
        
        this.tempString = null;
        this.tempUbicacion = null;
    }

    /** Metodos de Control para las Vistas*/
    /**
     * Carga la lista de departamentos 
     */
    public ArrayList<SelectItem> cargarUbicaciones() {
        ArrayList<SelectItem> lista = new ArrayList<SelectItem>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        String sql = "SELECT u FROM Ubicacion u "
                + "WHERE u.ubicacion IS NULL";
        Query query = session.createQuery(sql);
        Iterator iter = query.list().iterator();

        while (iter.hasNext()) {
            Ubicacion s = (Ubicacion) iter.next();
            lista.add(new SelectItem(s.getIdUbicacion(), s.getVcNombreUbicacion(), ""));
        }
        session.close();
        return lista;
    }

    /**Nuevo Alumno*/
    public void nuevoAlumno() {
        this.persona = new Persona(); //this.persona controla los datos de persona del alumno
        this.alumno = new Alumno(); //this.alumno controla los datos propios de la tabla alumno
        this.selectedUbicacion = null; //selectedUbicacion maneja el id del lugar de nacimiento del alumno en la tabla alumno como idUbicacion
        this.tempUbicacion = null;
        this.selectedDepartamento = null;
        this.bautismo = false;      //Manejan los sacramentos que ha recibido el alumno
        this.comunion = false;
        this.confirmacion = false;
        this.problemaSalud = new Problemasalud(); //Variable que maneja el problema de salud que se agregara a la tabla en la vista
        this.problemasDeSalud = new ArrayList<Problemasalud>(); //Aqui se almacenan todos los problemas de salud del alumno
        this.boEditAlumno = false;
    }

    /** Agregar Problemas de Salud en la tabla*/
    public void addProblema() {
        this.problemasDeSalud.add(this.problemaSalud);
        this.problemaSalud = new Problemasalud();
    }

    /** Quita Problemas de Salud de la tabla*/
    public void removeProblema() {
        this.problemasDeSalud.remove(this.selectedProblema);
    }

    /** Agregar Alumnos en la tabla*/
    public void addAlumno() throws ParseException {
        Object[] obj = new Object[9];
        obj[0] = this.alumno;
        obj[1] = this.persona;
        obj[2] = this.tempUbicacion;
        obj[3] = this.problemasDeSalud;
        obj[4] = this.bautismo;
        obj[5] = this.comunion;
        obj[6] = this.confirmacion;
        obj[7] = this.selectedDepartamento;
        obj[8] = this.listaUbicaciones;

        System.out.println("tempUbicacion al guardar: "+this.tempUbicacion);

        /** Para agregar al otro array que muestra la tabla en la matricula*/
        Object[] objMatricula = new Object[17];
        objMatricula[0] = new Matricula();
        objMatricula[1] = this.persona;
        objMatricula[2] = new ArrayList<Compromiso>();
        objMatricula[3] = new Recibo();
        objMatricula[4] = null;
        objMatricula[5] = new Recordanecdotico();
        objMatricula[6] = new Persona();
        objMatricula[7] = null;
        objMatricula[8] = new ArrayList<Object[]>();
        objMatricula[9] = (new Double(0)).doubleValue();
        objMatricula[10] = false;
        objMatricula[11] = this.alumno;
        objMatricula[12] = this.tempUbicacion;
        objMatricula[13] = this.bautismo;
        objMatricula[14] = this.comunion;
        objMatricula[15] = this.confirmacion;
        objMatricula[16] = this.problemasDeSalud;

        if (this.boEditAlumno) {
            this.alumnos.set(this.alumnos.indexOf(this.selectedAlumno), obj);
        } else {
            alumnos.add(obj); /*Compone el arreglo de otros arreglos 
             * como alumno, persona, ubicacion,
             * problemas de salud , etc*/
            this.matricula.getArregloMatriculas().add(objMatricula); //Solo si es insercion que ingrese en el array de matriculas
        }
        this.vaciar();
    }

    /** Quita Alumnos de la tabla*/
    public void removeAlumno() {
        this.alumnos.remove(this.selectedAlumno);
        this.matricula.getArregloMatriculas().add(this.selectedAlumno);
        this.selectedAlumno = new Object[9];
        this.vaciar();
    }

    /** Modifica Alumnos de la tabla*/
    public void editAlumno() {
        this.vaciar();
        this.alumno = (Alumno) this.selectedAlumno[0];
        this.persona = (Persona) this.selectedAlumno[1];
        this.problemasDeSalud = (ArrayList<Problemasalud>) this.selectedAlumno[3];
        this.bautismo = (Boolean) this.selectedAlumno[4];
        this.comunion = (Boolean) this.selectedAlumno[5];
        this.confirmacion = (Boolean) this.selectedAlumno[6];
        this.boEditAlumno = true;
        this.selectedDepartamento = (Long) this.selectedAlumno[7];
        this.listaUbicaciones = (ArrayList<SelectItem>) this.selectedAlumno[8];
        this.selectedUbicacion = (Long) this.selectedAlumno[2];
    }

    /** Agregar Compromisos a la Tabla */
    public void addCompromiso() {
        this.compromisos.add(this.compromiso);
        this.compromiso = new Compromiso();
    }

    /** Remover del Array que controla la tabla*/
    public void removeCompromiso() {
        this.compromisos.remove(this.selectedCompromiso);
    }

    /** for (Problemasalud p : this.problemasDeSalud) { Para recorrer arreglos de clases
    System.out.println(p.getVcDescripcion());
    }*/
    /** Vaciar variables*/
    public void vaciar() {
        this.alumno = new Alumno();
        this.persona = new Persona();
        this.selectedUbicacion = null;
        this.tempUbicacion = null;
        this.problemasDeSalud = new ArrayList<Problemasalud>();
        this.bautismo = false;
        this.comunion = false;
        this.confirmacion = false;
        this.boEditAlumno = false;
        this.selectedDepartamento = null;
        this.listaUbicaciones = new ArrayList<SelectItem>();
    }

    /** Convierte Date a String*/
    public String getStringDate(Date d) {
        if (d == null) {
            return "";
        }
        return FacesUtil.getStringDate(d);
    }

    /** Autogenerar numero de recibo*/
    public int generarNumRecibo(Session session) {
        int numero = 1;
        String sql = "SELECT MAX(r.nuNumRecibo) FROM recibo r";
        Query query = session.createSQLQuery(sql);
        if (query.uniqueResult() != null) {
            numero = ((Integer) query.uniqueResult()).intValue() + 1;
        }
        return numero;
    }

    public void onClickNav() {
        /*No contiene Nada pero asi es...*/
    }

    public void limpiarFrmPadres() {
        String limpiar = (String) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("limpiar");
        if ("limpiarPadre".equals(limpiar)) {
            this.buscarPadre = null;
            this.personaPadre = new Persona();
            this.lugarTrabPadre = new Lugtrabajo();
            this.onCheckMismosDatosPadre();
        } else {
            if ("limpiarMadre".equals(limpiar)) {
                this.buscarMadre = null;
                this.personaMadre = new Persona();
                this.lugarTrabMadre = new Lugtrabajo();
                this.direccionTemp = null;
                this.telefonoTemp = null;
            } else {
                this.buscarResponsable = null;
                this.personaResponsable = new Persona();
                this.lugarTrabResponsable = new Lugtrabajo();
            }
        }
    }

    /*Metodo para el autoComplete*/
    public void onSelectNomPadre(SelectEvent event) {
        this.onKeyPress();
    }

    /**Cargar datos en los formularios una vez se seleccione el nombre del campo de tipo autocomplete*/
    private void onKeyPress() {
        Session session = HibernateUtil.getSessionFactory().openSession();
        String tipoPersona = (String) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("tipoPersona");
        String sql = "SELECT p FROM Persona p "
                + "WHERE CONCAT_WS(' ',p.vcNombres,p.vcApellidos) "
                + "LIKE :valor ";

        Query query = session.createQuery(sql);
        query.setMaxResults(1);

        if ("Padre".equals(tipoPersona)) { /*Para que busque si es madre o padre o responsable*/
            query.setParameter("valor", "%" + this.buscarPadre + "%");
        } else if ("Madre".equals(tipoPersona)) {
            query.setParameter("valor", "%" + this.buscarMadre + "%");
        } else if ("Responsable".equals(tipoPersona)) {
            query.setParameter("valor", "%" + this.buscarResponsable + "%");
        } else {
            query.setParameter("valor", "%" + this.buscarAlumno + "%");
        }

        if ("Alumno".equals(tipoPersona)) {
            this.personaAlumno = (Persona) query.uniqueResult();
        } else if ("Padre".equals(tipoPersona)) {
            this.personaPadre = new Persona();
            this.lugarTrabPadre = new Lugtrabajo();

            this.personaPadre = (Persona) query.uniqueResult();
            Iterator iterLugTrabajo = this.personaPadre.getLugtrabajos().iterator();
            if (iterLugTrabajo.hasNext()) {
                this.lugarTrabPadre = (Lugtrabajo) iterLugTrabajo.next();
            }
        } else if ("Madre".equals(tipoPersona)) {
            this.personaMadre = new Persona();
            this.lugarTrabMadre = new Lugtrabajo();

            this.personaMadre = (Persona) query.uniqueResult();
            Iterator iterLugTrabajo = this.personaMadre.getLugtrabajos().iterator();
            if (iterLugTrabajo.hasNext()) {
                this.lugarTrabMadre = (Lugtrabajo) iterLugTrabajo.next();
            }

            this.direccionTemp = this.personaMadre.getVcDireccion();
            this.telefonoTemp = this.personaMadre.getVcTelefono();
        } else if ("Responsable".equals(tipoPersona)) {
            this.personaResponsable = new Persona();
            this.lugarTrabResponsable = new Lugtrabajo();

            this.personaResponsable = (Persona) query.uniqueResult();
            Iterator iterLugTrabajo = this.personaResponsable.getLugtrabajos().iterator();
            if (iterLugTrabajo.hasNext()) {
                this.lugarTrabResponsable = (Lugtrabajo) iterLugTrabajo.next();
            }
        }
        session.close();
    }

    public void onSelectResponsable() {
        MatriculaBean m = (MatriculaBean) FacesUtil.getBean("matriculaBean");
        m.setResponsable(new Persona());
        m.setLugarTrabResponsable(new Lugtrabajo());

        // this.personaResponsable = new Persona();
        // this.lugarTrabResponsable = new Lugtrabajo();
        this.boMostrarBuscaResp = false;
        this.buscarResponsable = null;

        if ("Madre".equals(this.quienResponsable)) {
            m.setResponsable(this.personaMadre);
            m.setLugarTrabResponsable(this.lugarTrabMadre);
            //this.personaResponsable = this.personaMadre;
            //this.lugarTrabResponsable = this.lugarTrabMadre;
        } else if ("Padre".equals(this.quienResponsable)) {
            m.setResponsable(this.personaPadre);
            m.setLugarTrabResponsable(this.lugarTrabPadre);
            //this.personaResponsable = this.personaPadre;
            //this.lugarTrabResponsable = this.lugarTrabPadre;
        } else {
            this.boMostrarBuscaResp = true;
        }
    }

    public void onCheckAsignarRecibo() {
        if (this.asignarRecibo) {
            this.boMostrarRecibo = true;
        } else {
            this.boMostrarRecibo = false;
        }
    }

    public void onCheckMismosDatosPadre() {
        if (this.datosIguales) {
            this.personaMadre.setVcDireccion(this.personaPadre.getVcDireccion().toString());
            this.personaMadre.setVcTelefono(this.personaPadre.getVcTelefono().toString());
        } else {
            this.personaMadre.setVcDireccion(this.direccionTemp);
            this.personaMadre.setVcTelefono(this.telefonoTemp);
        }
    }

    public void onSelectDepartamento() {
        UbicacionBean n = (UbicacionBean) FacesUtil.getBean("ubicacionBean");
        this.listaUbicaciones = n.cargarListaMunicipios(selectedDepartamento);
    }

    public String onFlowProcess(FlowEvent event) {
        return event.getNewStep();
    }

    /** Getters & Setters */
    public Alumno getAlumno() {
        return alumno;
    }

    public void setAlumno(Alumno alumno) {
        this.alumno = alumno;
    }

    public Persona getPersona() {
        return persona;
    }

    public void setPersona(Persona persona) {
        this.persona = persona;
    }

    public Problemasalud getProblemaSalud() {
        return problemaSalud;
    }

    public void setProblemaSalud(Problemasalud problemaSalud) {
        this.problemaSalud = problemaSalud;
    }

    public ArrayList<Ubicacion> getListaUbicacion() {
        return listaUbicacion;
    }

    public void setListaUbicacion(ArrayList<Ubicacion> listaUbicacion) {
        this.listaUbicacion = listaUbicacion;
    }

    public Long getSelectedUbicacion() {
        return selectedUbicacion;
    }

    public void setSelectedUbicacion(Long selectedUbicacion) {
        this.selectedUbicacion = selectedUbicacion;
    }

    public ArrayList<Problemasalud> getProblemasDeSalud() {
        return problemasDeSalud;
    }

    public void setProblemasDeSalud(ArrayList<Problemasalud> problemasDeSalud) {
        this.problemasDeSalud = problemasDeSalud;
    }

    public Problemasalud getSelectedProblema() {
        return selectedProblema;
    }

    public void setSelectedProblema(Problemasalud selectedProblema) {
        this.selectedProblema = selectedProblema;
    }

    public ArrayList<Object[]> getAlumnos() {
        return alumnos;
    }

    public void setAlumnos(ArrayList<Object[]> alumnos) {
        this.alumnos = alumnos;
    }

    public boolean isBautismo() {
        return bautismo;
    }

    public void setBautismo(boolean bautismo) {
        this.bautismo = bautismo;
    }

    public boolean isComunion() {
        return comunion;
    }

    public void setComunion(boolean comunion) {
        this.comunion = comunion;
    }

    public boolean isConfirmacion() {
        return confirmacion;
    }

    public void setConfirmacion(boolean confirmacion) {
        this.confirmacion = confirmacion;
    }

    public Object[] getSelectedAlumno() {
        return selectedAlumno;
    }

    public void setSelectedAlumno(Object[] selectedAlumno) {
        this.selectedAlumno = selectedAlumno;
    }

    public Long getSelectedDepartamento() {
        return selectedDepartamento;
    }

    public void setSelectedDepartamento(Long selectedDepartamento) {
        this.selectedDepartamento = selectedDepartamento;
    }

    public ArrayList<SelectItem> getListaUbicaciones() {
        return listaUbicaciones;
    }

    public void setListaUbicaciones(ArrayList<SelectItem> listaUbicaciones) {
        this.listaUbicaciones = listaUbicaciones;
    }

    public Persona getPersonaMadre() {
        return personaMadre;
    }

    public void setPersonaMadre(Persona personaMadre) {
        this.personaMadre = personaMadre;
    }

    public Persona getPersonaPadre() {
        return personaPadre;
    }

    public void setPersonaPadre(Persona personaPadre) {
        this.personaPadre = personaPadre;
    }

    public Padre getMadre() {
        return madre;
    }

    public void setMadre(Padre madre) {
        this.madre = madre;
    }

    public Padre getPadre() {
        return padre;
    }

    public void setPadre(Padre padre) {
        this.padre = padre;
    }

    public Lugtrabajo getLugarTrabMadre() {
        return lugarTrabMadre;
    }

    public void setLugarTrabMadre(Lugtrabajo lugarTrabMadre) {
        this.lugarTrabMadre = lugarTrabMadre;
    }

    public Lugtrabajo getLugarTrabPadre() {
        return lugarTrabPadre;
    }

    public void setLugarTrabPadre(Lugtrabajo lugarTrabPadre) {
        this.lugarTrabPadre = lugarTrabPadre;
    }

    public String getBuscarPadre() {
        return buscarPadre;
    }

    public void setBuscarPadre(String buscarPadre) {
        this.buscarPadre = buscarPadre;
    }

    public String getBuscarMadre() {
        return buscarMadre;
    }

    public void setBuscarMadre(String buscarMadre) {
        this.buscarMadre = buscarMadre;
    }

    public boolean isDatosIguales() {
        return datosIguales;
    }

    public void setDatosIguales(boolean datosIguales) {
        this.datosIguales = datosIguales;
    }

    public String getQuienResponsable() {
        return quienResponsable;
    }

    public void setQuienResponsable(String quienResponsable) {
        this.quienResponsable = quienResponsable;
    }

    public Lugtrabajo getLugarTrabResponsable() {
        return lugarTrabResponsable;
    }

    public void setLugarTrabResponsable(Lugtrabajo lugarTrabResponsable) {
        this.lugarTrabResponsable = lugarTrabResponsable;
    }

    public Persona getPersonaResponsable() {
        return personaResponsable;
    }

    public void setPersonaResponsable(Persona personaResponsable) {
        this.personaResponsable = personaResponsable;
    }

    public String getBuscarResponsable() {
        return buscarResponsable;
    }

    public void setBuscarResponsable(String buscarResponsable) {
        this.buscarResponsable = buscarResponsable;
    }

    /* public Matricula getMatricula() {
    return matricula;
    }
    
    public void setMatricula(Matricula matricula) {
    this.matricula = matricula;
    }*/
    public Compromiso getCompromiso() {
        return compromiso;
    }

    public void setCompromiso(Compromiso compromiso) {
        this.compromiso = compromiso;
    }

    public ArrayList<Compromiso> getCompromisos() {
        return compromisos;
    }

    public void setCompromisos(ArrayList<Compromiso> compromisos) {
        this.compromisos = compromisos;
    }

    public Compromiso getSelectedCompromiso() {
        return selectedCompromiso;
    }

    public void setSelectedCompromiso(Compromiso selectedCompromiso) {
        this.selectedCompromiso = selectedCompromiso;
    }

    public boolean isAsignarRecibo() {
        return asignarRecibo;
    }

    public void setAsignarRecibo(boolean asignarRecibo) {
        this.asignarRecibo = asignarRecibo;
    }

    public Recibo getRecibo() {
        return recibo;
    }

    public void setRecibo(Recibo recibo) {
        this.recibo = recibo;
    }

    public String getBuscarAlumno() {
        return buscarAlumno;
    }

    public void setBuscarAlumno(String buscarAlumno) {
        this.buscarAlumno = buscarAlumno;
    }

    public Persona getPersonaAlumno() {
        return personaAlumno;
    }

    public void setPersonaAlumno(Persona personaAlumno) {
        this.personaAlumno = personaAlumno;
    }

    public boolean isBoMostrarRecibo() {
        return boMostrarRecibo;
    }

    public void setBoMostrarRecibo(boolean boMostrarRecibo) {
        this.boMostrarRecibo = boMostrarRecibo;
    }

    /*public ArrayList<Object[]> getArregloMatriculas() {
    return arregloMatriculas;
    }*/

    /*public void setArregloMatriculas(ArrayList<Object[]> arregloMatriculas) {
    this.arregloMatriculas = arregloMatriculas;
    }*/
    public Recordanecdotico getRecord() {
        return record;
    }

    public void setRecord(Recordanecdotico record) {
        this.record = record;
    }

    public Long getSelectedSeccion() {
        return selectedSeccion;
    }

    public void setSelectedSeccion(Long selectedSeccion) {
        this.selectedSeccion = selectedSeccion;
    }

    public boolean isBoMostrarBuscaResp() {
        return boMostrarBuscaResp;
    }

    public void setBoMostrarBuscaResp(boolean boMostrarBuscaResp) {
        this.boMostrarBuscaResp = boMostrarBuscaResp;
    }

    public Object[] getSelectedMatricula() {
        return selectedMatricula;
    }

    public void setSelectedMatricula(Object[] selectedMatricula) {
        this.selectedMatricula = selectedMatricula;
    }

    public String getTempString() {
        return tempString;
    }

    public void setTempString(String tempString) {
        this.tempString = tempString;
    }

    public Long getTempUbicacion() {
        return tempUbicacion;
    }

    public void setTempUbicacion(Long tempUbicacion) {
        this.tempUbicacion = tempUbicacion;
    }    
}
